package demo4;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

/**
 * 依赖关系
 *
 * 当一个类在实现某种功能时，使用了另一个类，那么此时可以说当前类与另一个有依赖关系
 * Spring建议我们将当前类依赖的类都可以定义为属性
 *
 * 那么在创建当前类时Spring会将当前类依赖的类自动装配到该属性上，而这种通过属性将依赖的对象设置到当前对象的过程称为“依赖注入”
 */
@Component
public class Person {
    /**
     * 该注解用于定义在属性上，告知Spring该属性需要自动装配
     * 此时Spring会根据属性类型扫描包中的类，找到合适的类并初始化它
     * 然后将找到的实例赋值给该属性
     */
    @Autowired
    /**
     * 如果Spring在自动装配时发现多个可以装配的类时
     * 例如：
     * 当前项目中Clothes 接口有2个实现类：Shirt,Sweater
     * 那么如果没有特别说明，Spring在装配时会抛出异常
     *
     * 此时我们的做法有两种
     * 1：避免在Spring中出现可以匹配多个实现类的情况
     * 2：通过@Qualifier注解来指定
     */
    @Qualifier("winter")
    //private Shirt shirt;
    //private Sweater sweater;
    private Clothes clothes;//面向接口，人需要衣服，不是具体某种衣服

    @Override
    public String toString() {
        return "Person{" +
                "clothes=" + clothes +
                '}';
    }
}
